/* Package test test 的工具函数 */

package test

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"net/http/httptest"

	"github.com/gin-gonic/gin"
)

// ParseToStr 将 map 中的键值对输出成 querystring 形式
func ParseToStr(mp map[string]string) string {
	values := ""
	for key, val := range mp {
		values += "&" + key + "=" + val
	}

	temp := values[1:]
	values = "?" + temp

	return values
}

// Get 根据特定请求uri，发起get请求返回响应
func Get(uri string, router *gin.Engine) []byte {
	// 构造 get 请求
	req := httptest.NewRequest("GET", uri, nil)
	// 初始化相应
	w := httptest.NewRecorder()

	// 调用相应的 handler 接口
	router.ServeHTTP(w, req)

	// TODO: 解析 result 内容 ??
	// 提取相应
	result := w.Result()
	defer result.Body.Close()

	// 读取相应的 body
	body, _ := ioutil.ReadAll(result.Body)

	return body
}

// PostForm 根据特定请求uri和参数param，以表单形式传递参数，发起post请求返回响应
func PostForm(uri string, param map[string]string, router *gin.Engine) []byte {
	// 构造 post 请求，表单数据以 querystring 形式加在 uri 之后
	req := httptest.NewRequest("POST", uri+ParseToStr(param), nil)

	// 初始化响应
	w := httptest.NewRecorder()

	// 调用相应的 handler 接口
	router.ServeHTTP(w, req)

	// 提取响应
	result := w.Result()
	defer result.Body.Close()

	// 读取响应 body
	body, _ := ioutil.ReadAll(result.Body)

	return body
}

// PostJSON 根据特定请求uri和参数param，以Json形式传递参数，发起post请求返回响应
func PostJSON(uri string, param map[string]interface{}, router *gin.Engine) []byte {
	// 将参数转化为 json 比特流
	jsonByte, _ := json.Marshal(param)

	// 构造 post 请求，json 数据以请求 body 的形式传递
	req := httptest.NewRequest("POST", uri, bytes.NewReader(jsonByte))

	// 初始化相应
	w := httptest.NewRecorder()

	// 调取相应的 handler 接口
	router.ServeHTTP(w, req)

	// 提取响应
	result := w.Result()
	defer result.Body.Close()

	// 读取响应 body
	body, _ := ioutil.ReadAll(result.Body)

	return body
}
